package com.common.www.utils;

import java.util.Date;
import java.util.HashMap;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.ExpiredJwtException;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;

/**
 * jwt工具类
 *
 * @author zyl
 */
public class JwtUtils {

    private final static String base64EncodedSecretKey = "base64EncodedSecretKey";//私钥
    /**
     * 毫秒
     */
    public final static int TOKEN_EXP_MS = 14 * 24 * 60 * 60 * 1000;//过期时间, 1000 * 60测试使用60秒
    /**
     * 毫秒
     */
//    public final static int TOKEN_EXP_MS = 10 * 1000;//过期时间, 1000 * 60测试使用60秒
    /**
     * 秒(这个是设置给session用的  session以秒为单位)
     */
    public final static int TOKEN_EXP_S = TOKEN_EXP_MS / 1000 / 24 / 14;//过期时间, 1000 * 60测试使用60秒

    /**
     * 最后操作的静态映射表
     */
    @Deprecated
    public static HashMap<String, Long> lastUpdateHastmap = new HashMap<>();

    public static String getToken(String userId) {
        return Jwts.builder()
                .setSubject(userId)
                .claim("userId", userId)
                .setIssuedAt(new Date())
                .setExpiration(new Date(System.currentTimeMillis() + TOKEN_EXP_MS)) /*过期时间*/
                .signWith(SignatureAlgorithm.HS256, base64EncodedSecretKey)
                .compact();
    }

    //解析token
    public static TOKEN_STATUS checkToken(String token) {
        try {
            final Claims claims = Jwts.parser().setSigningKey(base64EncodedSecretKey).parseClaimsJws(token).getBody();
//            claims.setExpiration(new Date());
//            System.out.println("从token中解析到的username==" + claims);
//            String username = (String) claims.get("userId");
//            System.out.println("username==" + username);
            return TOKEN_STATUS.SUCCESS;
        } catch (ExpiredJwtException e1) {
//            throw new ServletException("token expired");
            return TOKEN_STATUS.EXPIRED;
        } catch (Exception e) {
//            throw new ServletException("other token exception");
            return TOKEN_STATUS.EXCEPTION;
        }
    }

    /**
     * 从token中获取用户id
     */
    public static String getUserIdByToken(String token) {
        final Claims claims = Jwts.parser().setSigningKey(base64EncodedSecretKey).parseClaimsJws(token).getBody();
        String userId = (String) claims.get("userId");
        return userId;
    }

    public enum TOKEN_STATUS {
        SUCCESS, EXPIRED, EXCEPTION
    }
}